package E_2024;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;

public class E_100_6 {
    /*
    在一款虚拟游戏中生活，你必须进行投资以增强在虚拟游戏中的资产以免被淘汰出局。现有一家Bank，它提供有若干理财产品 M 个，风险及投资回报不同，你有 N(元)进行投资，能接收的总风险值为X.你要在可接受范围内选择最优的投资方式获得最大回报
    备注:
    1：在虚拟游戏中，每项投资风险值相加为总风险值:
    2：在虚拟游戏中，最多只能投资2个理财产品;
    3：在虚拟游戏中，最小单位为整数，不能拆分为小数;
    4：投资额*回报率=投资回报
    输入描述
        第一行:
            产品数 (取值范围[1,20])
            总投资额 (整数，取值范围[1,100001])
            可接受的总风险 (整数，取值范围[1,200])
        第二行: 产品投资回报率序列，输入为整数，取值范围[1,60]
        第三行: 产品风险值序列，输入为整数，取值范围[1,100]
        第四行: 最大投资额度序列，输入为整数，取值范围[1，10000]
    输出描述
        每个产品的投资额序列
     */
    public static void main(String[] args) {
        List<CP> cps = new ArrayList<>();
        cps.add(new CP(3,9,100));
        cps.add(new CP(2,1,50));
        cps.add(new CP(4,4,600));
        cps.add(new CP(2,6,400));
        cps.add(new CP(20,11,100));
        System.out.println("==== "+Arrays.toString(ans1(cps, 700, 12)));
    }
    public static CP[] ans1(List<CP> cps , int tz, int fx){
        cps.sort(Comparator.comparing(cp -> cp.fx));
        // 所有符合风险的组合
        List<CP[]> ansCP = new ArrayList<>();
        for (int i = 0; i < cps.size(); i++) {
            CP cp = cps.get(i);
            if (cp.fx <= fx) ansCP.add(new CP[]{null,cp});
            for (int j = i+1; j < cps.size(); j++) {
                CP cpj = cps.get(j);
                if (cp.fx + cpj.fx <= fx) ansCP.add(new CP[]{cp,cpj});
            }
        }
        int max = 0;
        CP[] ans = null;
        // 计算各组合获得的回报
        for (CP[] cp : ansCP) {
            int hb = 0;
            int cptz = tz;
            // 先计算高汇报率
            int tz1 = Math.min(cptz, cp[1].ed);
            cptz -= tz1;
            hb += (tz1 * cp[1].hbl);
            cp[1].ed = tz1;
            // 再计算低汇报率，
            if (cp[0] != null) {
                int tz0 = Math.min(cptz, cp[0].ed);
                hb += (tz0 * cp[0].hbl);
                cp[0].ed = tz0;
            }
            if (hb > max){
                max = hb;
                ans = cp;
            }

            System.out.println(hb +"--"+Arrays.toString(cp));
        }
        return ans;
    }
   static class CP {
        public CP(int h, int f, int e){
            hbl = h;
            fx =f;
            ed = e;
        }

       @Override
       public String toString() {
           return "hbl: "+ hbl +" fx: "+fx+" ed: "+ed;
       }

       int hbl;
        int fx;
        int ed;
    }
}
